
struct ListNode {
     int val;
     ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
     ListNode(int x, ListNode *next) : val(x), next(next) {}
 };
 
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
            return head;
        ListNode* newhead = head->next;
        ListNode* prev = nullptr;
        ListNode* cur = head;
        ListNode* next = head->next;
        ListNode* nextnext = next->next;
        int flag = 1;
        while(next)
        {
            cur->next = nextnext;
            next->next = cur;
            if(prev)
                prev->next = next;

            // 2. 更新指针，准备处理下一组
            prev = cur;            // 上一组尾节点 = 当前组交换后的尾（原cur）
            cur = nextnext;        // 当前组第一个节点 = 下一组起始（之前暂存的nextnext）
            if (cur == nullptr)    // 下一组没有节点，提前退出
                break;
            next = cur->next;      // 当前组第二个节点 = 下一组第二个节点
            if (next == nullptr)   // 下一组只有一个节点，无需交换，退出
                break;
            nextnext = next->next; // 暂存下下组的起始节点
        }

        return newhead;
    }
};